#include <sys/timerfd.h>
#include <iostream>
#include <unistd.h>
// int timerfd_create(int clockid, int flags);

/*
    clockid:   CLOCK_REALTIME 系统实时时间 改变系统时间会进行改变
                CLOCK_MONOTONIC 从开机时间计算的一个基准值
    flags : 0代表阻塞

*/

// int timerfd_settime(int fd, int flags, const struct itimerspec *new_value,struct itimerspec *old_value);

/*
    fd:创建一个定时器的时候返回的文件描述符
    flags：0-相对时间， 1-绝对时间；默认设置为0即可.
    old_value：之前定时器的定时时间 不需要默认为空
*/
// struct timespec
// {
//     time_t tv_sec; /* Seconds */
//     long tv_nsec;  /* Nanoseconds */
// };

// struct itimerspec
// {
//     struct timespec it_interval; /* Interval for periodic timer */ //第一次之后的超时时间
//     struct timespec it_value;    /* Initial expiration */ //第一次定时器的超时时间
// };

// 定时器工作原理 没经过一个超时时间 会进行我们的写入8字节数据
int main()
{
    int fd = timerfd_create(CLOCK_MONOTONIC, 0);
    if (fd < 0)
    {
        perror("timerfd create erroe");
        return 0;
    }
    struct itimerspec timer;
    timer.it_interval.tv_sec = 3;
    timer.it_interval.tv_nsec = 0;

    timer.it_value.tv_sec = 1;
    timer.it_value.tv_nsec = 0;

    timerfd_settime(fd, 0, &timer, nullptr);

    while (true)
    {
        uint64_t tmp;
        int n = read(fd, &tmp, 8);
        if (n < 0)
        {
            // 此时退出
            break;
        }
        std::cout << "超时了一次" << std::endl;
    }
    return 0;
}